/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polylifegame.model;

import java.io.Serializable;

/**
 *
 * @author epulapp
 */
public class Case implements Serializable {
    
    //<editor-fold defaultstate="collapsed" desc="Variables de classe">
    //Référence sur l'environnement
    private Environnement environnement;
    //Position de la cellule en X
    private Integer posX;
    //Position de la cellule en Y
    private Integer posY;
    //Etat de la case à l'état N
    private Boolean etatN;
    //Etat de la case à l'état N+1
    private Boolean etatN1;
    //</editor-fold>    

    
    //<editor-fold defaultstate="collapsed" desc="Constructeurs">
    /**
     * Constructeur par défaut
     */
    public Case(){
        this.environnement = null;
        this.posX = 0;
        this.posY = 0;
        this.etatN = false;
        this.etatN1 = false;
    }

    /**
     * Constructeur personnalisé 
     * @param environnement
     * @param posX
     * @param posY
     * @param etatN
     * @param etatN1 
     */
    public Case(Environnement environnement, Integer posX, Integer posY, Boolean etatN, Boolean etatN1) {
        this.environnement = environnement;
        this.posX = posX;
        this.posY = posY;
        this.etatN = etatN;
        this.etatN1 = etatN1;
    }
    //</editor-fold>
    
    
    //<editor-fold defaultstate="collapsed" desc="Méthodes de classe">
    
    /**
     * Calcul l'etat N+1 de la case 
     */
    public void calculN1(){
        this.setEtatN1(this.getEtatSuivant(this.getEnvironnement().getVoisines(this), this.getEtatN()));
    }
    
    /**
     * Récupère l'etat suivant en fonction du nombre de voisins de la case et de son état
     * @param voisinsVivants : nombre de voisins vivants
     * @param etatCase : etat de la case courante
     * @return 
     */
    public Boolean getEtatSuivant(Integer voisinsVivants, Boolean etatCase){
        
        Boolean etatSuivant = etatCase;
        
        //Si la case est activée et a moins de 2 ou plus de 3 voisins elle est désactivée
        if(etatCase){
            if(!(voisinsVivants == 2 || voisinsVivants ==3)){
                etatSuivant = false;
            }        
        } 
        //Si la case est désactivée et a exactement 3 voisins elle est activée
        else if(voisinsVivants==3){
            etatSuivant = true;
        }
        
        return etatSuivant;
    }
    
    /**
     * Mise à jour de l'état N de la case par son etat N+1
     */
    public void MAJetatN(){
        this.setEtatN(this.getEtatN1());
    }

    @Override
    public String toString() {
        if(this.getEtatN())
            return "O";
        else 
            return ".";
    }
    
    
    
    //</editor-fold>
    
    
    //<editor-fold defaultstate="collapsed" desc="Getters et Setters">
    /**
     * Retourne l'environnement courant
     * @return Environnement env : retourne l'environnement courant
     */
    public Environnement getEnvironnement() {
        return environnement;
    }
    /**
     * Set l'environnement courant par l'environnement passé en paramètre
     * @param environnement : Environnement à assigner à l'environnement courant 
     */
    public void setEnvironnement(Environnement environnement) {
        this.environnement = environnement;
    }

    public Boolean getEtatN() {
        return etatN;
    }

    public void setEtatN(Boolean etatN) {
        this.etatN = etatN;
    }

    public Boolean getEtatN1() {
        return etatN1;
    }

    public void setEtatN1(Boolean etatN1) {
        this.etatN1 = etatN1;
    }

    public Integer getPosX() {
        return posX;
    }

    public void setPosX(Integer posX) {
        this.posX = posX;
    }

    public Integer getPosY() {
        return posY;
    }

    public void setPosY(Integer posY) {
        this.posY = posY;
    }
    //</editor-fold>
}
